<?php
namespace App\Services\Tools;

use App\Exceptions\BasicException;

class JwtService
{
    /**
     * 获取token
     *
     * @param  array  $information
     * @return string
     */
    static function generate_token($information = [])
    {
        $ext = [
            'expire_time' => env('QIPAO_JWT_EXPIRE') + time(),
            'random'      => rand(),
        ];
        //merge 消息数组
        $array = array_merge($information, $ext);

        return base64_encode(hash_hmac('SHA256', http_build_query($array), env("QIPAO_JWT_SECRET"), true)) . "." . base64_encode(http_build_query($array));
    }

    /**
     * 只校验token!检查token是否合法,ip是否变化,登录是否过期
     *
     * @param $token
     * @param $ip
     * @return int
     * @throws BasicException
     */
    static function verify_token($token, $ip)
    {
        //截取基础信息数组
        $info_str = substr(strstr($token, '.'), 1);
        $param_str = base64_decode($info_str);
        //获取token中的秘钥字符串
        $secret = strstr($token, '.', true);
        //校验token是否合法
        if ($secret != base64_encode(hash_hmac('SHA256', $param_str, env("QIPAO_JWT_SECRET"), true))) {
            throw new BasicException(10003);
        }
        //参数信息校验
        parse_str($param_str, $param_arr);
        //校验过期信息
        if (time() > $param_arr['expire_time']) {
            throw new BasicException(10004);
        }

        return $param_arr['admin_id'] ?? 0;
    }

    /**
     * 从token中获取基础信息(不做校验,只在框架内部调用,必须校验通过后的方法才可调用)
     *
     * @param $keys
     * @return array
     */
    static function getInfoFromToken($token, $keys)
    {
        $info_str = substr(strstr($token, '.'), 1);
        $param_str = base64_decode($info_str);
        parse_str($param_str, $param_arr);
        $data = [
            'admin_id' => $param_arr['admin_id'],
        ];
        if (array_key_exists($keys, $data)) {
            return $data[$keys];
        }

        return $data;
    }
}
